Глава III
3.4. Определение и свойства поверхностей B-сплайнов

Поверхность B-сплайна получается из двунаправленной сети контрольных точек, двух узловых векторов, и результатов одномерных функций B-сплайна

`S(u,v)=sum_{i=0}^nsum_{j=0}^mN_{i,p}(u)N_{j,q}(v)P_{i,j}` (3.11)

`U="{"ubrace(0,…,0)_(p+1),u_{p+1},…,u_{r-p-1},ubrace(1,…,1)_(p+1)"}"`

`V="{"ubrace(0,…,0)_(q+1),v_{q+1},…,v_{s-q-1},ubrace(1,…,1)_(q+1)"}"`

`U` имеет `r+1` узлов, и `V` имеет `s+1`. Уравнение (3.2) принимает вид

`r=n+p+1`   и   `s=m+q+1`(3.12)

Пусть `U` и `{N_{i,3}(u)}` будут узловым вектором и кубической базисной функцией рис 3.2а, и `{N_{j,2}(v)}` квадратичной базисной функцией определенными `V={0,0,0,`1⁄5,2⁄5,3⁄5,3⁄5,4⁄5,`1,1,1}`. Рисунки 3.19а и 3.19бпоказывают тензорное произведение базисных функций `N_{4,3}(u)N_{4,2}(v)` и `N_{4,3}(u)N_{2,2}(v)` соответственно. Рисунки 3.20-3.25 показы­вают примеры поверхностей B-сплайнов.

Рисунок 3.19. Кубические `xx` квадратичные базисные функции, (а) `N_{4,3}(u)N_{4,2}(v)`; (б) `N_{4,3}(u)N_{2,2}(v)`; `U={0,0,0,0,`1⁄4,1⁄2,3⁄4,`1,1,1,1}` и `U={0,0,0,`1⁄5,2⁄5,3⁄5,4⁄5,`1,1,1}`.

Пять шагов, которые необходимы для вычисления точки на поверхности B-сплайна при фиксированных значения параметров `(u,v)`:

  1. найти промежуточный узел, в котором лежит `u`, скажем `u∈[u_i,u_{i+1})` (Алгоритм A2.1);
  2. вычислить отличные от нуля базисные функции `N_{i-p,p}(u),…,N_{i,p}(u)` (А2.2);
  3. найти промежуточный узел, в котором лежит `V`, скажем `v∈[v_j,v_{j+1})` (A2.1);
  4. вычислить отличные от нуля базисные функции `N_{j-q,q}(v),…,N_{j,q}(v)` (А2.2);
  5. умножить значения ненулевых базисных функций с соответствующими контрольными точками.

Последний шаг принимает форму

`S(u,v)=[N_{k,p}(u)]^T[P_{k,l}][N_{l,q}(v)]`   `i-p≤k≤i,j-q≤l≤j`(3.12)

Следует отметить, что `[N_{k,p}(u)]^T` это `1xx(p+1)` вектор-строка скаляров, `[P_{k,l}]` является `(p+1)xx(q+1)` матрицей контрольных точек, и `[N_{l,q}(v)]` является `(q+1)xx1` вектор-столбец скаляров.

Примеры

Пример3.4 Пусть `p=q=2` и `sum_{i=0}^4sum_{j=0}^5N_{i,2}(u)N_{j,2}(v)P_{i,j}` с

`U="{"0,0,0,`2⁄5,3⁄5,`1,1,1"}"`

`V="{"0,0,0,`1⁄5,1⁄2,4⁄5,`1,1,1"}"`

Вычислим `S(1/5,3/5)`. Тогда `1/5 in [u_2,u_3)` и `3/5 in [v_4,v_5)` и

`S(1/5,3/5)=[N_{0,2}(1/5)N_{1,2}(1/5)N_{2,2}(1/5)]xx[[P_{0,2},P_{0,3},P_{0,4}], [P_{1,2},P_{1,3},P_{1,4}],[P_{2,2},P_{2,3},P_{2,4}]]xx[[N_{2,2}(3/5)],[N_{3,2}(3/5)],[N_{4,2}(3/5)]]`

Алгоритм A3.5 вычисляет точку на поверхности B-сплайна по фиксированным значениям `(u,v)`. Для повышения эффективности, он использует локальный массив, temp[], чтобы сохранить вектор/матрицу произведения `[N_{k,p}(u)]^T[P_{k,l}]`. Полученный вектор точек (при temp[]) затем умножается с вектором `[N_{l,q}(v)]`.

Алгоритм А3.5

SurfacePoint(n,p,U,m,q,V,P,u,v,S)
{ /* Вычислить  точку  поверхности */
  /* Вход: n,p,U,m,q,V,P,u,v */
  /* Выход: S */
uspan = FindSpan(n,p,u,U);
BasisFuns(uspan,u,p,U,Nu);
vspan = FindSpan(m,q,v,V);
BasisFuns(vspan,v,q,V,Nv);
uind = uspan – p;
S = 0.0;
for (l=0; l<=q; l++)
   {
   temp = 0.0;
   vind = vspan – q – l;
   for (k=0; k<=p; k++)
      temp = temp + Nu[k]*P[uind+k][vind];
   S = S + Nv[l]*temp;
   }
}
    

Свойства тензорного произведения базисных функций следуют из соответствующих свойств одномерных базисных функций, перечисленных в главе 2.

Св.3.12 Не отрицательность: `N_{i,p}(u)N_{j,q}(v)≥0` для всех `i,j,p,q,u,v`;
Св.3.13 Разбиение единицы: `∑_{i=0}^n∑_{j=0}^mN_{i,p}(u)N_{j,q}(v)=1` для всех `(u,v)∈[0,1]×[0,1]`;
Св.3.14 Если `n=p`, `m=q`, `U={0,…,0,1,…,1}`, и `V={0,…,0,1,…,1}`, тогда `N_{i,p}(u)N_{j,q}(v)=B_{i,n}(u)B_{j,m}(v)` для всех `i`, `j`; то есть, результат функций B-сплайна вырождаются в произведения полиномов Бернштейна;
Св.3.15 `N_{i,p}(u)N_{j,q}(v)=0` если `(u,v)` находится за пределами прямоугольника `[u_i,u_{i+p+1})×[v_j,v_{j+q+1})` (см рисунки 3.19а и 3.19б);
Св.3.16 В любом данном прямоугольнике, `[u_{i_0},u_{i_0+1})×[v_{j_0},v_{j_0+1})`, в крайнем случае `(p+1)(q+1)` базисные функции не равны нулю, в частности, `N_{i,p}(u)N_{j,q}(v)` для `i_0-p≤i≤i_0`,`j_0-q≤j≤j_0`;
Св.3.17 Если `p>0` и `q>0`, тогда `N_{i,p}(u)N_{j,q}(v)` достигает ровно одно максимальное значение ( смотри рисунки 3.19а и 3.19б);
Св.3.18 Границы прямоугольников, образованны u и v узловыми линиями, где функ­ция является двумерный полином, все частные производные `N_{i,p}(u)N_{j,q}(v)` существуют; в `u` узел (`v` узел) она в `p-k` (`q-k`) раз дифференцируемые в направлении `u`(`v`), где `k` является кратность узла. На рисунке 3.19а первая частичная производная `N_{4,3}(u)N_{4,2}(v)` по отношению к `v` является непре­рывным по узловой линии `v=`3⁄5, где `N_{4,2}(v)` имеет выступ. Вторая частная производная по отношению к u непрерывна всюду, потому что `N_{4,3}(u)` яв­ляется `C^2` непрерывной.

Поверхности B-сплайнов имеют следующие свойства:

Св.3.19 Если `n=p`, `m=q`, `U={0,…,0,1,…,1}`, и `V={0,…,0,1,…,1}`, тогда `S(u,v)` это поверхность Безье; это следует из Св.3.14;
Св.3.20 Поверхность интерполируется по четырём угловыми контрольным точкам: `S(0,0)=P_{0,0}`, `S(1,0)=P_{n,0}`, `S(0,1)=P_{0,m}` и `S(1,1)=P_{n,0}` (рисунки с 3.20 до 3.25); это следует из Св.3.13 и идентичности

`N_{0,p}(0)N_{0,q}(0)=N_{n,p}(1)N_{0,q}(0)=N_{0,p}(0)N_{m,q}(1)=N_{n,p}(1)N_{m,q}(1)=1`

Св.3.21 Аффинная инвариантность: аффинное преобразование применяемое к поверхности, применяется к её контрольным точкам; это следует из Св.3.13;
Св.3.22 Свойство сильной выпуклой оболочки: если `(u,v)∈[u_{i_0},u_{i_0+1})×[v_{j_0},v_{j_0+1})`, тогда `S(u,v)` находится в выпуклой оболочке опорных точек `P_(i,j)`, `i_0-p≤i≤i_0` и `j_0-q≤j≤j_0` (смотри рисунок 3.21); это следует из Св.3.12, Св.3.13 и Св.3.16;
Св.3.23 Если триангулируем, контрольные сетевые формы представляют кусочно плоской приближение к поверхности; как и в случае кривых, чем ниже степень, тем лучше приближение (смотри рисунки 3.22а и 3.22б);
Св.3.24 Схема местных модификаций: если `P_{i,j}` перенесена, она действует на поверхность только в прямоугольнике `[u_i,u_{i+p+1})×[v_j,v_{j+q+1})`; это следует из Св.3.15. Теперь рассмотрим рисунки 3.23а и 3.23б: исходная поверхность плоская, потому что все контрольные точки лежат в одной плоскости (Св.3.22); Контрольная сеть смещена от поверхности для лучшей визуализации. Когда `P_{3,5}` перемещается она влияет на форму поверхности только в прямоугольнике `[1⁄4,1)×[2⁄5,1)`;
Св.3.25 Непрерывность и дифференцируемость `S(u,v)` следует из базисных функций. В частности, `S(u,v)` в `p-k` (`q-k`) раз дифференцируемой в `u(v)` направление на `u(v)` узел кратности `k`. Рисунок 3.24 показывает квадратичную×кубическую поверхность, определяемую на узел векторов `U={0,0,0,`1⁄2,1⁄2,`1,1,1}` и `V={0,0,0,`1⁄2,`1,1,1,1}`. Обратите внимание на складки на поверхности, соот­ветствующий узел линии `u=`1⁄2; Конечно, как и в случае кривых, можно располо­жить контрольные точки таким образом, что они взаимно аннигилируют разрывы в базисных функций. С помощью многократно совпадающих контрольных точек, визуальные разрывы могут быть созданы там, где нет соответствующих разрывов в базисных функциях; Рисунок 3.25 показывает такую поверхность, которая бику­бическая без каких-либо нескольких узлов. Таким образом, вторая частная произ­водная всюду непрерывна. Складка образуется из-за нескольких контрольных точек.

Рисунок 3.20. Поверхность B-сплайна, (a) контрольная сеть; (b) поверхность.

Рисунок 3.21. (a) кубическая`xx`квадратичная поверхность B-сплайна; (b) свойство сильной выпуклой оболочки.

Рисунок 3.22. а) биквадратичная поверхность; (б) биквартик поверхность `(p=q=4)`, использующая те же контрольные точки, что и на рисунке 3.22a.

Рисунок 3.23. (а) Плоская квадратичная`xx`кубическая поверхность, `U={0,0,0,`1⁄4,1⁄2,3⁄4,`1,1,1}` и `V=(0,0,0,0,`1⁄5,2⁄5,3⁄5,4⁄5,`1,1,1,1}`; (b) `P_{3,5}` перемещается, влияя на форму поверхности только в прямоугольнике `[1⁄4,1)xx[2⁄5,1)`.

Рисунок 3.24. Квадратичная`xx`кубическая поверхность со складкой, `U={0,0,0,`1⁄2,1⁄2,`1,1,1}` и `V={0,0,0,0,`1⁄2,`1,1,1,1}`.

Рисунок 3.25. Бикубическая поверхность со складкой, `U={0,0,0,0,`1⁄4,1⁄2,3⁄4,`1,1,1,1}` и `V={0,0,0,0,`1⁄2,`1,1,1,1}`; `P_{2,j}=P_{3,j}=P_{4,j}` для `0≤j≤4`.

Заметим здесь, что нет никакого известного свойства уменьшения изменения для B-сплайн поверхностей (смотри [Prau92]).

Изо-параметрические кривые на `S(u,v)` получают по способу, аналогичному тому, что для Безье поверхностей. Зафиксируем `u=u_0`

`C_{u_0}(v)=S(u_0,v)=sum_{i=0}^nsum_{j=0}^mN_{i,p}(u_0)N_{j,q}(v)P_{i,j}` `=sum_{j=0}^mN_{j,q}(v)(sum_{i=0}^nN_{i,p}(u_0)P_{i,j})=sum_{j=0}^mN_{j,q}(v)Q_j(u_0)`(3.14)

где   `Q_j(u_0)=sum_{i=0}^nN_{i,p}(u_0)P_{i,j}`

Аналогично   `C_(v_0)(u)=sum_{i=0}^nN_{i,p}(u)Q_i(v_0)`

где   `Q_i(v_0)=sum_{j=0}^mN_{j,q}(v_0)P_{i,j}`(3.15)

это изо кривая на `S(u,v)`. `C_(u_0)(v)` является `q`-ой степенью кривой B-сплайна на `V` и `C_{v_0}(u)` является `p`-ой степенью кривой B-сплайна на `U`. Точка `S(u_0,v_0)` это пересечение `C_{u_0}(v)` и `C_{v_0}(u)`. Все линии, показанные на поверхностях в рисунках 3.20-3.25 являются изолиниями.